package chat_server;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.EOFException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;

/**
 *
 * @author igo
 */
public class Client{
    
    private int PORT = 24500;
    private String titulo = "Chat V3.0 - by Igo";
    private JFrame janela = new JFrame(titulo);
    private Container fundo = janela.getContentPane();
    private JTextArea ecra = new JTextArea("",5,100);
    private JTextField escreve = new JTextField("");
    private JButton enviar = new JButton("Enviar");
    private JButton fechar = new JButton("Fechar");
    private String Nickname = "";
    private Socket cSocket;
    private String servidor;
    private JScrollBar vbar;
    private ObjectOutputStream oos;
    private ObjectInputStream ois;

    public static void main(String[] args) {
        Client C = new Client();
        C.graph();
        C.logic();
    }

    private void graph() {
        janela.setLocation(200, 200);
        janela.setSize(500, 200);

        fundo.setLayout(new BorderLayout());

        ecra.setEditable(false);
        ecra.setBackground(Color.WHITE);
        ecra.setLineWrap(true);
        ecra.setWrapStyleWord(true);
        
        
        JScrollPane sp = new JScrollPane(ecra);

        JPanel pm = new JPanel();
        pm.setLayout(new GridLayout(1,2));
        pm.add(sp);
        sp.setBounds(10,60,10,15);
        sp.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
        
        vbar = sp.getVerticalScrollBar();
        
        fundo.add(pm, BorderLayout.CENTER);        
        
        JPanel painel_mensagem = new JPanel();
        painel_mensagem.setLayout(new BorderLayout());
        painel_mensagem.add(escreve, BorderLayout.CENTER);
        
        fechar.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent ae) {
                try {
                    cSocket.close();
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        
        enviar.addActionListener(new ActionListener(){

            public void actionPerformed(ActionEvent ae) {
                try {
                    if(!escreve.getText().isEmpty()){
                        Mensagem M = new Mensagem(Nickname,"",escreve.getText());
   
                        oos.reset();
                        oos.writeObject(M);
                        escreve.setText("");
                    }
                } catch (IOException ex) {
                    Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });
        
        escreve.addKeyListener(new KeyListener(){

            @Override
            public void keyTyped(KeyEvent ke) {
                
            }

            @Override
            public void keyPressed(KeyEvent ke) {
                
            }

            @Override
            public void keyReleased(KeyEvent ke) {
                if(ke.getKeyCode() == KeyEvent.VK_ENTER){
                    try {
                        if(!escreve.getText().isEmpty()){
                            Mensagem M = new Mensagem(Nickname,"",escreve.getText());

                            oos.reset();
                            oos.writeObject(M);
                            escreve.setText("");
                          //System.out.println("MensagemEnviada: "+msg);
                        }
                    } catch (IOException ex) {   
                        Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
 });
        
        JPanel botoes = new JPanel();
        botoes.setLayout(new GridLayout(1,2));
        botoes.add(enviar);
        botoes.add(fechar);
        painel_mensagem.add(botoes, BorderLayout.EAST);

        fundo.add(painel_mensagem, BorderLayout.SOUTH);

        janela.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        janela.setVisible(true);
        
    }

    private void logic()  {       
        
        boolean ligou = true;
        try{
            do{
                servidor = JOptionPane.showInputDialog(janela,"Introduz o endereço do servidor","Configuração do Chat",JOptionPane.QUESTION_MESSAGE);
            }while(servidor.isEmpty() || servidor == null);
        }catch(NullPointerException e){
            JOptionPane.showMessageDialog(janela, "É necessário especificar o servidor ao qual quer ligar.\nPor defeito irá ser ligado ao \"localhost\"", "Configuração do Chat", JOptionPane.INFORMATION_MESSAGE);
            servidor = "localhost";
        }
        
        try{
            do{
                Nickname = JOptionPane.showInputDialog(janela,"Introduz o teu Nick","Configuração do Chat",JOptionPane.QUESTION_MESSAGE);
            }while(Nickname.isEmpty());
        }catch(NullPointerException e){
            int i = (int) (Math.random() * 9999999);
            Nickname = "Guest" + i;
            JOptionPane.showMessageDialog(janela, "É necessário especificar o seu nick.\nPor defeito o seu nick será \""+Nickname+"\"", "Configuração do Chat", JOptionPane.INFORMATION_MESSAGE);
        }
        
        //msg.setRemetente(Nickname);
        janela.setTitle("[ "+getNickname()+" ] * "+titulo);
        
        try {
            cSocket = new Socket(servidor, PORT);
            
            oos = new ObjectOutputStream(cSocket.getOutputStream());
            ois = new ObjectInputStream(cSocket.getInputStream());

            Mensagem login = new Mensagem(Nickname, "", "entrou no chat!");
            oos.reset();
            oos.writeObject(login);
            
            while(ligou){
                    Mensagem M = (Mensagem) ois.readObject();
                 //   System.out.println("A"+a);
                    if(M!=null){
                        ecra.append(M+"\n");

                        if( ((vbar.getValue() + vbar.getVisibleAmount()) == vbar.getMaximum()) ) 
                            ecra.setCaretPosition( ecra.getDocument().getLength() );

                    }else{
                        JOptionPane.showMessageDialog(janela, "O Servidor foi desligado!", "Erro!", JOptionPane.ERROR_MESSAGE);
                        cSocket.close();
                        System.exit(0);
                    }
            }
        } catch (IOException e) {
            //Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, e);
            JOptionPane.showMessageDialog(janela, "O Servidor Foi Desligado!", "Erro no Servidor!", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        } catch (ClassNotFoundException e){
            //Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, e);
            JOptionPane.showMessageDialog(janela, "ClassNotFoundException!", "Erro!", JOptionPane.ERROR_MESSAGE);
            System.exit(0);
        }
    }
    
    public String getNickname(){
        return Nickname;
    }
}